home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AMIGA-CD 2
/
Amiga-CD - Volume 2.iso
/
gepackte_disketten
/
1994
/
08_94_5.dms
/
08_94_5.adf
/
term-4.0-Source.lha
/
termPickScreen.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-06-26
|
5KB
|
283 lines
/*
** termPickScreen.c
**
** Simplified public screen selection routine
**
** Copyright © 1990-1994 by Olaf `Olsen' Barthel
** All Rights Reserved
*/
#include "termGlobal.h"
enum { GAD_LIST=1,GAD_USE,GAD_CANCEL };
/* BuildScreenList():
*
* Build a private copy of the public screen list.
*/
STATIC struct List *
BuildScreenList(VOID)
{
struct List *List,*PubScreenList;
/* Get the list body. */
if(List = (struct List *)AllocVecPooled(sizeof(struct List),MEMF_ANY))
{
NewList(List);
/* Get access to the public screen list. */
if(PubScreenList = LockPubScreenList())
{
struct Node *Next,*Node;
Node = PubScreenList -> lh_Head;
/* Scan the list. */
while(Next = Node -> ln_Succ)
{
/* Don't include the current `term' public
* screen name in it.
*/
if(strcmp(Node -> ln_Name,TermIDString))
{
struct Node *New = CreateNode(Node -> ln_Name);
/* Got a new node? */
if(New)
AddTail(List,New);
}
Node = Next;
}
UnlockPubScreenList();
}
/* In case the list happens to remain empty,
* include the Workbench screen in it.
*/
if(!List -> lh_Head -> ln_Succ)
{
struct Node *New = CreateNode("Workbench");
if(New)
AddTail(List,New);
else
{
FreeVecPooled(List);
List = NULL;
}
}
}
return(List);
}
/* PickScreen(STRPTR Name):
*
* Your nice public screen selection routine.
*/
BYTE __regargs
PickScreen(struct Window *Window,STRPTR Name)
{
struct List *ScreenList;
BYTE Result = FALSE;
if(ScreenList = BuildScreenList())
{
struct LayoutHandle *Handle;
if(Handle = LT_CreateHandleTags(Window -> WScreen,
LH_LocaleHook, &LocaleHook,
TAG_DONE))
{
struct Window *Window;
ULONG Index = (ULONG)~0,i;
struct Node *Node;
for(Node = ScreenList -> lh_Head, i = 0 ; Node -> ln_Succ ; Node = Node -> ln_Succ, i++)
{
if(!strcmp(Node -> ln_Name,Name))
{
Index = i;
break;
}
}
LT_New(Handle,
LA_Type, VERTICAL_KIND,
TAG_DONE);
{
LT_New(Handle,
LA_Type, VERTICAL_KIND,
LA_LabelID, MSG_V36_1271,
TAG_DONE);
{
LT_New(Handle,
LA_Type, LISTVIEW_KIND,
LA_LabelID, MSG_TERMPICKSCREEN_SCREEN_LIST_GAD,
LA_Chars, 40,
LA_ID, GAD_LIST,
LA_Lines, 10,
LALV_MaxGrowY, 20,
GTLV_Labels, ScreenList,
GTLV_Selected, Index,
LALV_Link, NIL_LINK,
LALV_CursorKey, TRUE,
TAG_DONE);
LT_EndGroup(Handle);
}
LT_New(Handle,
LA_Type,VERTICAL_KIND,
TAG_DONE);
{
LT_New(Handle,
LA_Type, XBAR_KIND,
LAXB_FullSize, TRUE,
TAG_DONE);
LT_EndGroup(Handle);
}
LT_New(Handle,LA_Type,HORIZONTAL_KIND,
LAGR_SameSize, TRUE,
LAGR_Spread, TRUE,
TAG_DONE);
{
LT_New(Handle,
LA_Type, BUTTON_KIND,
LA_LabelID, MSG_GLOBAL_USE_GAD,
LA_ID, GAD_USE,
LABT_ReturnKey, TRUE,
LABT_ExtraFat, TRUE,
TAG_DONE);
LT_New(Handle,
LA_Type, BUTTON_KIND,
LA_LabelID, MSG_GLOBAL_CANCEL_GAD,
LA_ID, GAD_CANCEL,
LABT_EscKey, TRUE,
LABT_ExtraFat, TRUE,
TAG_DONE);
LT_EndGroup(Handle);
}
LT_EndGroup(Handle);
}
if(Window = LT_Layout(Handle,LocaleString(MSG_TERMPICKSCREEN_SCREENS_TXT),NULL,0,0,IDCMP_CLOSEWINDOW,0,
LAWN_HelpHook, &GuideHook,
WA_DepthGadget, TRUE,
WA_CloseGadget, TRUE,
WA_DragBar, TRUE,
WA_RMBTrap, TRUE,
WA_Activate, TRUE,
TAG_DONE))
{
struct IntuiMessage *Message;
BOOLEAN Done = FALSE;
ULONG MsgClass,
MsgQualifier;
UWORD MsgCode;
struct Gadget *MsgGadget;
LT_ShowWindow(Handle,TRUE);
PushWindow(Window);
do
{
if(Wait(PORTMASK(Window -> UserPort) | SIG_BREAK) & SIG_BREAK)
break;
while(Message = (struct IntuiMessage *)GT_GetIMsg(Window -> UserPort))
{
MsgClass = Message -> Class;
MsgQualifier = Message -> Qualifier;
MsgCode = Message -> Code;
MsgGadget = (struct Gadget *)Message -> IAddress;
GT_ReplyIMsg(Message);
LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
if(MsgClass == IDCMP_CLOSEWINDOW)
Done = TRUE;
if(MsgClass == IDCMP_GADGETUP)
{
switch(MsgGadget -> GadgetID)
{
case GAD_USE:
if(Index != (ULONG)~0)
{
struct Node *Node = GetListNode(Index,ScreenList);
if(Node)
{
strcpy(Name,Node -> ln_Name);
Result = TRUE;
}
}
Done = TRUE;
break;
case GAD_CANCEL:
Done = TRUE;
break;
case GAD_LIST:
Index = MsgCode;
break;
}
}
if(MsgClass == IDCMP_IDCMPUPDATE)
{
struct Node *Node = GetListNode(Index = MsgCode,ScreenList);
if(Node)
{
strcpy(Name,Node -> ln_Name);
Done = Result = TRUE;
LT_PressButton(Handle,GAD_USE);
}
}
}
}
while(!Done);
PopWindow();
}
LT_DeleteHandle(Handle);
}
DeleteList(ScreenList);
}
else
DisplayBeep(Window -> WScreen);
return(Result);
}